package productions;

import exceptions.ParserException;
import lexico.ErrorTable;
import lexico.SymbolTable;
import lexico.TokenClass;

/**
 * @author heekinho
 */
public class AlgoritmoProduction extends AbstractProductionRule {
    /* Muitos dos métodos irão precisar de algo assim: */

    private static AlgoritmoProduction instance = new AlgoritmoProduction();

    public static AlgoritmoProduction getInstance() {
        return instance;
    }


    /**
     * Regra: algoritmo: 'algoritmo' IDENTIFIER ';'
     * @return
     * @throws ParserException
     */
    @Override
    public boolean analyze(SymbolTable st, ErrorTable et) throws ParserException {
        if (!basicParse(st, TokenClass.KEYWORD_ALGORITMO)) {
            return false;
        }
        if (!basicParse(st, TokenClass.IDENTIFIER)) {
            return skipUntilSynchronize(st, et, "Era esperado um identificador.");
        }
        if (!basicParse(st, TokenClass.DELIMITER_SEMICOLON)) {
            return skipUntilSynchronize(st, et, "Era esperado um ';'.");
        }

        return true;
    }

    @Override
    protected void populateFirst() {
        this.first.add(TokenClass.KEYWORD_ALGORITMO);
    }

    @Override
    protected void populateFollow() {
        //from  declarations.first
        follow.add(TokenClass.KEYWORD_CONSTANTES);
        follow.add(TokenClass.KEYWORD_TIPO);
        follow.add(TokenClass.KEYWORD_VARIAVEIS);

        //from principal.first
        this.follow.add(TokenClass.KEYWORD_FUNCAO);
    }
}
